import axios from 'axios'
import store from '@/store/index'
import router from '@/router'

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 在开发环境中修改根路径http://ihrm.itheima.net/api
  timeout: 5000
})

service.interceptors.request.use(
  config => {
    const token = store.getters.token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
// 响应拦截器
// 知识点1:axios内部的处理机制
// (1):http状态码为:2xx,3xx,就会给promise对象位置,返回成功的结果(resolve())
// (2):http状态码为4xx,5xx,就会给promise对象位置,返回错误的结果(reject())
// 如果你想做一些操作,可以在axios的响应拦截器,自己来处理返回的结果
// 补充:http状态码,由本次请求后,后端进行设置返回的
service.interceptors.response.use(// http为2xx,3xx进入这里
  // 本项目成功/失败都是2xx响应状态码,都会进入这里,所以需要自己根据字段判定
  response => {
    // 登录响应:response就是await的promise对象
    // 通过success返回的字段判定请求是否成功
    const { message, success } = response.data
    if (success === false) { // 失败
      return Promise.reject(new Error(message))
    } else { // 成功
      // 返回response->返回的还是axios处理的结果对象(逻辑页面.data.data)拿到后台返回值
      // 返回response.data->返回的就是后台返回的响应对象(逻辑那边拿到的真正的数据.data)拿到返回值
      return response.data// 特殊:response 它返回到的是axios调用在原地留下的"promise"对象位置(逻辑页面await后面)
    }
  },
  error => { // http为4xx,5xx进入这里
    // console.log(error)
    // token过期处理:error.response.data为401后端返回的数据
    if (error.response.data.code === 10002) {
      store.commit('user/RESET_STATE')
      store.commit('user/REMOVE_TOKEN')
      console.log(router)
      router.replace(`/login?redirect=${router.currentRoute.fullPath}`)
    }
    return Promise.reject(error)// 相当于reject(error)
  }
)

export default service
